package com.zjsru.plan2023.oneday.oneDay202301;

/**
 * @Author: CookLee
 * @Date: 2023/1/23
 *
 * 计算应缴税款总额
 *
 * 输入：brackets = [[3,50],[7,10],[12,25]], income = 10
 * 输出：2.65000
 * 解释：
 * 前 $3 的税率为 50% 。需要支付税款 $3 * 50% = $1.50 。
 * 接下来 $7 - $3 = $4 的税率为 10% 。需要支付税款 $4 * 10% = $0.40 。
 * 最后 $10 - $7 = $3 的税率为 25% 。需要支付税款 $3 * 25% = $0.75 。
 * 需要支付的税款总计 $1.50 + $0.40 + $0.75 = $2.65 。
 *
 * 输入：brackets = [[1,0],[4,25],[5,50]], income = 2
 * 输出：0.25000
 * 解释：
 * 前 $1 的税率为 0% 。需要支付税款 $1 * 0% = $0 。
 * 剩下 $1 的税率为 25% 。需要支付税款 $1 * 25% = $0.25 。
 * 需要支付的税款总计 $0 + $0.25 = $0.25 。
 */
public class CalculateTax {
    
    /**
     * 计算税:模拟
     *
     * @param brackets 税收
     * @param income   收入
     * @return double
     */
    public double calculateTax(int[][] brackets, int income) {
        double ans = 0;
        int lower = 0;
        for (int[] nums : brackets) {
            int amount = nums[0];
            int taxRate = nums[1];
            //获取区间的税收额度
            int tax = (Math.min(income, amount) - lower) * taxRate;
            ans += tax;
            //如果金额小于第一档税收要求，则直接break，第一次税收结果已经存在了ans中，且由于递增的特性以后循环也是break
            if (amount >= income) {
                break;
            }
            lower = amount;
        }
        return (double) ans / 100;
    }
    
    public static void main(String[] args) {
        CalculateTax calculateTax = new CalculateTax();
        int[][] brackets = new int[][] {{3, 50}, {7, 10}, {12, 25}};
        int income = 10;
        System.out.println(calculateTax.calculateTax(brackets, income));
    }
}
